#include <iostream>
using namespace std;

const int MAXN = 505;
int graph[MAXN][MAXN];  // 邻接矩阵存储图
int graph_size[MAXN];   // 每个节点的邻接点数量
long long dp[MAXN];     // dp[i]表示从节点i到终点B的路径数
bool visited[MAXN];     // 记录节点是否可达终点
bool calculated[MAXN];  // 记录dp是否已计算
int n, m, a, b;

// 计算从节点u到终点b的路径数
long long dfs(int u) {
  if (u == b) {
    visited[u] = true;
    calculated[u] = true;
    return dp[u] = 1;
  }

  if (calculated[u]) {
    return dp[u];
  }

  calculated[u] = true;
  dp[u] = 0;

  // 遍历u的所有邻接点
  for (int i = 0; i < graph_size[u]; i++) {
    int v = graph[u][i];
    dp[u] += dfs(v);
    // 如果从v可以到达b，则u也可以到达b
    if (visited[v]) {
      visited[u] = true;
    }
  }

  return dp[u];
}

int main() {
  cin >> n >> m;

  // 初始化
  for (int i = 0; i < MAXN; i++) {
    graph_size[i] = 0;
  }

  for (int i = 0; i < m; i++) {
    int s1, s2;
    cin >> s1 >> s2;
    // 添加边s1->s2
    graph[s1][graph_size[s1]] = s2;
    graph_size[s1]++;
  }

  cin >> a >> b;

  // 初始化dp和visited数组
  for (int i = 0; i < MAXN; i++) {
    dp[i] = 0;
    visited[i] = false;
    calculated[i] = false;
  }

  // 计算路径数
  long long pathCount = dfs(a);

  // 判断是否逻辑自洽并输出结果
  if (visited[a]) {
    cout << pathCount << " Yes" << endl;
  } else {
    cout << pathCount << " No" << endl;
  }

  return 0;
}